
// 建立链表
function Node(params) {
  this.value = params;
  this.next = null;
}

let a = new Node(1);
let b = new Node(2);
let c = new Node(3);
let d = new Node(4);

a.next = b;
b.next = c;
c.next = d;

// 倒置  （输出是按照整体输出  null<-a<-b<-c<-d,并非单独输出一个a，b，c，d）
function reserve(node) {
  if (node.next.next == null) {
    node.next.next = node;
    return node.next
  } else {
    let res = reserve(node.next);
    node.next.next = node;
    node.next = null;
    return res;
  }
}

//递归
function getNodevalue2(node) {
  if (node == null) return;
  console.log(node.value);
  getNodevalue2(node.next);
}

getNodevalue2(reserve(a));

/* 
单向链表的反转，这里用的递归方法：
   思路：a->b->-c->d->null    找到链表的最后一个节点来进行倒推反转，所以需要找到最后的节点d作为函数的出口，但是单纯的找到d点没有用，要想倒推需要找到最后节点的前一个节点c，找到c点，作为d的next节点输出，
        然后将c点的next点设置为空，重复以上步骤，因为c点next为空，那么c点就是链表最后一个节点，b点就变成c点next节点输出，并将b点next设为空，那么b点现在就是最后一个节点，a点作为b的next节点输出。
        最后按照输出的顺序是d->c->b->a;
    代码思路：这里运用了递归思路，有a点开始一直往前找，但是同时也要直到最后一个点的前一个节点，因此用node.next.next==null来进行判断，通过就输出node.next也就是d点，但是如果不满足就走了递归，
        而递归是一直在运行，因此不满足的节点按照倒序一直在走，找到不满足的点也就是b点，把b点作为c点的next节点，而b节点的next为空，那么b节点就是最后的节点输出，而a节点作为b节点的next输出。

*/


/* 
  递归思想：堆栈原理，先进后出，递归函数会一直执行，知道出现出口输出，而当出口输出之后，会执行递归函数之后的代码，并且因为栈 先进后出的原则，从最后一个递归执行，执行完毕就执行前一个，知道结束。

  

*/